setwd("/run/media/linhnguyen/DATA/Google Drive/R development/Inventory charts")

# Read the data and ensure the data is in dataframe format
library(readr)
inventory <- read_csv("inventory_data.csv")
inventory <- as.data.frame(inventory)

# Call other libraries to plot
library(ggplot2)
library(plotly)
library(dplyr)
library(reshape2)

Inventory stacked area chart

SKU 112991

source("func_InventoryStackedArea.R")
p1 <- InventoryStackedArea(inventory, 112991)
p1

SKU 1063491

source("func_InventoryStackedArea.R")
p2 <- InventoryStackedArea(inventory, 1063491)
p2

Days to expiry chart

SKU 112991

source("func_InventoryDaysToExpiry.R")
p3 <- InventoryDaysToExpiry(inventory, 112991)
p3

SKU 1063491

source("func_InventoryDaysToExpiry.R")
p4 <- InventoryDaysToExpiry(inventory, 1063491)
p4

Small multiple

Second graph with ggplot2

# Make sure on date format
inventory$Date  <- as.Date(inventory$Date,format = "%Y-%m-%d")
inventory$Expiration.Date  <- as.Date(inventory$Expiration.Date,format = "%Y-%m-%d")

inventory$Expiration.Text <- as.character(inventory$Expiration.Date)

# Calculate days to expiry
inventory$Days.To.Expiry <- inventory$Expiration.Date - inventory$Date
inventory$Days.To.Expiry <- as.numeric(inventory$Days.To.Expiry)

# Extract the SKU
test <- subset(inventory, SKU==112991)
test <- test[order(test$Expiration.Date, test$Date, decreasing = F),]

# Make the plot
ggplot(data=inventory, aes(x=Days.To.Expiry,y=Quantity,group=factor(Expiration.Text))) +
  geom_line() + scale_x_reverse() + 
  geom_hline(aes(yintercept = 0)) +
  geom_vline(aes(xintercept = 0)) +
  facet_wrap(~SKU) +
  ggtitle("Inventory by days to expiry") +
  xlab("Days to expiry")

Second graph with plotly

sku.list <- unique(inventory$SKU)

## First SKU
test <- subset(inventory, SKU==sku.list[1])
test <- test[order(test$Expiration.Date, test$Date, decreasing = F),]

data.unique <- unique(test$Expiration.Date)

# Draw the first batch
inv.batch1 <- test[test$Expiration.Date == data.unique[1],]
colnames(inv.batch1)[colnames(inv.batch1) == "Quantity"] <- "value"
test.cast1 <- dcast(data = inv.batch1, formula = Days.To.Expiry ~ Expiration.Date)
test.cast1 <- test.cast1[order(test.cast1$Days.To.Expiry, decreasing = TRUE),]

# colnames(test)[colnames(test) == "Quantity"] <- "value"
# test.cast <- dcast(data = test, formula = Date ~ Expiration.Date)
# test.cast <- merge(x = test.cast, y = test, by = "Date", all.x = TRUE)
# test.cast <- subset(test.cast, select = -c(SKU, value, Expiration.Date, Expiration.Text))
# test.cast <- test.cast[,c(ncol(test.cast), 2:(ncol(test.cast) - 1))]

p <- plot_ly(test.cast1, x = test.cast1[[1]], y = test.cast1[[2]], name = as.character(data.unique[1]), type = 'scatter', mode = 'lines') %>%
  layout(xaxis = list(autorange = "reversed", title = "Days to expiry"))
# add_trace(y = test.cast[[8]], name = 'trace 1', mode = 'lines') %>%
# add_trace(y = test.cast[[9]], name = 'trace 2', mode = 'lines') %>%

# Add the remaining batches
for (i in 2:length(data.unique)){
  inv.batch <- test[test$Expiration.Date == data.unique[i],]
  colnames(inv.batch)[colnames(inv.batch) == "Quantity"] <- "value"
  test.cast <- dcast(data = inv.batch, formula = Days.To.Expiry ~ Expiration.Date)
  test.cast <- test.cast[order(test.cast$Days.To.Expiry, decreasing = TRUE),]
  
  p <- add_trace(p, x = test.cast[[1]], y = test.cast[[2]], name = as.character(data.unique[i]), mode = 'lines')
}

plot.list <- list()
plot.list[[1]] <- p

## Next SKUs
for (i in 2:length(sku.list)){
  test <- subset(inventory, SKU==sku.list[i])
  test <- test[order(test$Expiration.Date, test$Date, decreasing = F),]
  
  data.unique <- unique(test$Expiration.Date)
  
  # Draw the first batch
  inv.batch1 <- test[test$Expiration.Date == data.unique[1],]
  colnames(inv.batch1)[colnames(inv.batch1) == "Quantity"] <- "value"
  test.cast1 <- dcast(data = inv.batch1, formula = Days.To.Expiry ~ Expiration.Date)
  test.cast1 <- test.cast1[order(test.cast1$Days.To.Expiry, decreasing = TRUE),]
  
  # colnames(test)[colnames(test) == "Quantity"] <- "value"
  # test.cast <- dcast(data = test, formula = Date ~ Expiration.Date)
  # test.cast <- merge(x = test.cast, y = test, by = "Date", all.x = TRUE)
  # test.cast <- subset(test.cast, select = -c(SKU, value, Expiration.Date, Expiration.Text))
  # test.cast <- test.cast[,c(ncol(test.cast), 2:(ncol(test.cast) - 1))]
  
  p1 <- plot_ly(test.cast1, x = test.cast1[[1]], y = test.cast1[[2]], name = as.character(data.unique[1]), type = 'scatter', mode = 'lines') %>%
    layout(xaxis = list(autorange = "reversed", title = "Days to expiry"))
  # add_trace(y = test.cast[[8]], name = 'trace 1', mode = 'lines') %>%
  # add_trace(y = test.cast[[9]], name = 'trace 2', mode = 'lines') %>%
  
  # Add the remaining batches
  for (j in 2:length(data.unique)){
    inv.batch <- test[test$Expiration.Date == data.unique[j],]
    colnames(inv.batch)[colnames(inv.batch) == "Quantity"] <- "value"
    test.cast <- dcast(data = inv.batch, formula = Days.To.Expiry ~ Expiration.Date)
    test.cast <- test.cast[order(test.cast$Days.To.Expiry, decreasing = TRUE),]
    
    p1 <- add_trace(p1, x = test.cast[[1]], y = test.cast[[2]], name = as.character(data.unique[i]), mode = 'lines')
  }
  
  plot.list[[i]] <- p1
}

subplot(plot.list, nrows = 15, shareX = TRUE, shareY = TRUE) %>% layout(dragmode = "select")